package cn.ike.web.controller;

import cn.ike.domain.system.Module;
import cn.ike.domain.system.User;
import cn.ike.service.system.ModuleService;
import cn.ike.service.system.RoleService;
import cn.ike.service.system.UserService;
import lombok.extern.log4j.Log4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
@Log4j
public class LoginController extends BaseController{

    // 注入UserService
    @Autowired
    private UserService userSerive;

    // 注入ModuleService
    @Autowired
    private ModuleService modelService;

    /**
     * 普通的登陆认证
     * 用户登录

    @RequestMapping("/login")
    public ModelAndView login(String email, String password) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行用户登录开始...");
            //1.判断用户输入的数据
            if (StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
                model.setViewName("forward:/login.jsp");
                return model;
            }
            //2.通过邮箱账号查询用户对象
            User user = userSerive.findByEmail(email);
            //3.如果用户不为空 并且 用户的密码与输入的密码相同 即可登录成功
            if (user != null && user.getPassword().equals(password)){
                // 登录成功，保存用户到session域中
                session.setAttribute("loginUser", user);
                // 动态菜单：查询用户所属角色的所有权限
                List<Module> moduleList = modelService.findModuleByUserId(user.getId());
                session.setAttribute("moduleList", moduleList);
                model.setViewName("home/main");
                return model;
            }else {
                //5.登录失败，跳转到登录页面
                model.addObject("error", "登录用户名或密码错误");
                model.setViewName("forward:/login.jsp");
            }
            log.info("执行用户登录结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行用户登录出现异常！", e);
        }
        return model;
    }*/

    /**
     * Shiro的登陆认证
     */
    @RequestMapping("/login")
    public ModelAndView login(String email, String password) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行用户登录开始...");
            // 判断用户输入的数据
            if (StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
                model.setViewName("forward:/login.jsp");
                return model;
            }
            // 获取subject对象, 表示当前用户1
            Subject subject = SecurityUtils.getSubject();
            // 创建封装账号密码的token
            UsernamePasswordToken token = new UsernamePasswordToken(email, password);
            // shiro登陆认证: 自动执行realm类中的认证方法，在认证方法中访问数据库数据
            subject.login(token);

            // 认证成功，获取shiro认证后的身份对象。
            // subject.getPrincipal() 获取的是realm的认证方法返回的对象的构造函数的第一个参数
            User user = (User) subject.getPrincipal();

            // 登录成功，保存用户到session域中
            session.setAttribute("loginUser", user);
            // 动态菜单：查询用户所属角色的所有权限
            List<Module> moduleList = modelService.findModuleByUserId(user.getId());
            session.setAttribute("moduleList", moduleList);
            model.setViewName("home/main");
            log.info("执行用户登录结束...");
            return model;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行用户登录出现异常！", e);
            //5.登录失败，跳转到登录页面
            model.addObject("error", "登录用户名或密码错误");
            model.setViewName("forward:/login.jsp");
        }
        return model;
    }

    @RequestMapping("/home")
    public String home() {
        return "home/home";
    }

    @RequestMapping("/logout")
    public String logout(){
        // 释放shiro中的认证信息
        SecurityUtils.getSubject().logout();
        // 删除session域中的登录用户
        session.removeAttribute("loginUser");
        // 销毁session
        session.invalidate();
        return "forward:/login.jsp";
    }
}
